package com.scs.application.modules.sys.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.scs.application.consts.ParamKeys;
import com.scs.application.core.service.BaseServiceImpl;
import com.scs.application.core.utils.*;
import com.scs.application.modules.cfg.utils.ParameterUtils;
import com.scs.application.modules.sys.entity.OnlineUser;
import com.scs.application.modules.sys.mapper.OnlineUserMapper;
import com.scs.application.modules.sys.service.OnlineUserService;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 */
@Service
public class OnlineUserServiceImpl extends BaseServiceImpl<OnlineUserMapper, OnlineUser> implements OnlineUserService {


    @Override
    public String applyToken(String userCode,String deviceType) {

        // 超时时间，默认两小时
        long timeout = 72 * 60 * 60 * 1000;

        String requestIp = WebUtils.getRequestIp();
        if (IPUtils.isLocalAddr(requestIp)) {
            timeout = 72 * 60 * 60 * 1000;
        }

        String token = Md5Utils.md5(userCode + UUID.randomUUID().toString());

        //当前时间
        Date now = new Date();
        //过期时间
        Date expireTime = new Date(now.getTime() + timeout);

//        String deviceType = "0";

        // 是否支持同一设备类型多处登录
        boolean allowMultipleLogin = ParameterUtils.getBoolean(ParamKeys.ALLOW_MULTIPLE_LOGIN, false);
        if (!allowMultipleLogin) {
            // 非智能设备 如果不支持，删除之前所有的token，重新创建
            if (!"1".equals(deviceType)) {
                List<OnlineUser> onlineUsers = baseMapper.selectList(
                        new QueryWrapper<OnlineUser>().eq("user_code", userCode).eq("device_type", deviceType));
                for (OnlineUser onlineUser : onlineUsers) {
                    // 删除SHIRO缓存
                    CacheUtils.remove(CacheUtils.AUTHENTICATION_CACHE, onlineUser.getToken());
                }

                baseMapper.delete(new QueryWrapper<OnlineUser>().eq("user_code", userCode).eq("device_type", deviceType));
            }
        } else {
            // 删除已经过期的token，避免数据堆积
            baseMapper.delete(new QueryWrapper<OnlineUser>().eq("user_code", userCode).lt("gmt_expire", new Date()));
        }

        OnlineUser userToken = new OnlineUser();
        //设备类型。0：PC，1：APP，2:智能柜
        switch (UtilCommon.getStr(deviceType,"0")) {
            case "0":
                userToken.setDeviceTypeName("PC端");
                break;
            case "2":
                userToken.setDeviceTypeName("APP端");
                break;
            default:
                userToken.setDeviceTypeName("智能柜");
        }


        userToken.setUserCode(userCode)
                .setToken(token)
                .setLoginIp(requestIp)
                .setGmtLogin(new Date())
                .setDeviceType(deviceType)
                .setGmtExpire(expireTime);
        this.save(userToken);
        return userToken.getToken();
    }

    @Override
    public OnlineUser findByToken(String token) {
        return this.getOne(
                Wrappers.<OnlineUser>query()
                        .eq("token", token)
                        .last("limit 1")
        );
    }
}
